package com.lq.game;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.Random;

/**
 * @author 李琦 on 2021/7/19.
 * @version java version "16.0.1" 2021-04-20
 * gamepanel继承了JPanel后,才具备面板的功能,才能成为一个面板
 */
public class gamepanel extends JPanel {

    //定义两个数组
    //一个数组专门存蛇的x轴坐标
    int[] snackx=new int[666];
    //一个数组专门存蛇的x轴坐标
    int[] snacky=new int[666];
    //游戏只有两个状态,开始和暂停
    boolean isStart=false;//默认游戏是暂停状态
    //加入一个定时器
    Timer timer;
    //蛇的长度
    int length;
    //定义蛇的行走方向
    String direction;
    //定义食物坐标
    int foodx,foody;
    //定义积分
    int score;
    //死亡判定
    boolean isdie=false;//初始情况下小蛇是活着的
    public void init(){
        length=3;
        //初始化蛇头坐标
        snackx[0]=260;
        snacky[0]=280;
        //初始化第一节身体坐标
        snackx[1]=240;
        snacky[1]=280;
        //初始化第二节身体坐标
        snackx[2]=220;
        snacky[2]=280;
        //初始化蛇头的方向
        direction="R";//R U D L
        foodx=440;
        foody=440;


    }//初始化
    public gamepanel(){
        init();
        //将焦点定位在当前操作的面板上
        this.setFocusable(true);
        //加入监听
        this.addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {//监听键盘的按下操作
                super.keyPressed(e);
                int keyCode = e.getKeyCode();
                System.out.println(keyCode);
                if(keyCode==KeyEvent.VK_SPACE){
                    if(isdie==true){
                        init();
                        isdie=false;
                        score=0;
                    }else{
                        isStart=!isStart;//开始变暂停,暂停变开始
                        repaint();//重绘的动作
                    }
                }
                //监听向上箭头
                if (keyCode==KeyEvent.VK_UP){
                    direction="U";
                }
                //监听向下箭头
                if (keyCode==KeyEvent.VK_DOWN){
                    direction="D";
                }
                //监听向左箭头
                if (keyCode==KeyEvent.VK_LEFT){
                    direction="L";
                }
                //监听向右箭头
                if (keyCode==KeyEvent.VK_RIGHT){
                    direction="R";
                }


            }

        });
        //对定时器进行初始化
        timer=new Timer(100, new ActionListener() {
            //ActionListener:事件监听,每一百毫秒监听一下是否发生了一个动作
            @Override
            public void actionPerformed(ActionEvent e) {
                if(isStart&&isdie==false){//游戏时开始状态蛇才会动,
                    for(int i=length-1;i>0;i--){//后一节身子移动到前一节身子的位置
                        snackx[i]=snackx[i-1];
                        snacky[i]=snacky[i-1];
                    }
                    //动脑袋
                    if("R".equals(direction)){
                        snackx[0]+=20;
                    }

                    if("L".equals(direction)){
                        snackx[0]-=20;
                    }

                    if("D".equals(direction)){
                        snacky[0]+=20;
                    }

                    if("U".equals(direction)){
                        snacky[0]-=20;
                    }
                    //防止蛇超出边界
                    if(snackx[0]>780){
                        snackx[0]=0;
                    }
                    if(snackx[0]<0){
                        snackx[0]=780;
                    }
                    if(snacky[0]>760){
                        snacky[0]=180;
                    }
                    if(snacky[0]<180){
                        snacky[0]=760;
                    }
                    //监测碰撞的动作
                    if(snackx[0]==foodx&&snacky[0]==foody) {
                        //蛇的长度加一
                        length+=1;
                        //食物坐标发生改变
                        foodx=((int)(Math.random()*38)*20);//x的坐标在0--760之间
                        foody=(int)(Math.random()*28+9)*20;//y的坐标应该在180--740之间9--37*20
                        //foody=(new Random().nextInt(29)+9)*20;//y的坐标应该在180--740之间9-37*20
                        //吃上一次食物积分加1.
                        score++;
                        System.out.printf("食物坐标x是"+String.valueOf(foodx)+"\n");
                        System.out.printf("食物坐标y是"+String.valueOf(foody)+"\n");
                    }
                    for(int i=1;i<length;i++){
                        if(snackx[0]==snackx[i]&&snacky[0]==snacky[i]){
                            isdie=true;

                        }
                    }
                        repaint();//重绘
                }
            }
        });
        timer.start();


    }
    /*
  paintComponent这个方法比较特殊,这个方法属于图形版的main方法
   */
    protected void  paintComponent(Graphics g){
        super.paintComponent(g);
        //填充背景颜色
        this.setBackground(new Color(124, 135, 135, 255));

        //画头部图片
        //paintIcon四个参数:this当前面板.g使用的画笔.xy对应的坐标.
        images.headerImg.paintIcon(this,g,0,-10);

        //画一个矩形
        g.setColor(new Color(116, 232, 90, 143));
        g.fillRect(0,180,785,580);

        //画小蛇
        //蛇头
        if("R".equals(direction)) {
            images.rightImg.paintIcon(this, g, snackx[0], snacky[0]);
        }
        if("L".equals(direction)) {
            images.leftImg.paintIcon(this, g, snackx[0], snacky[0]);
        }
        if("D".equals(direction)) {
            images.downImg.paintIcon(this, g, snackx[0], snacky[0]);
        }
        if("U".equals(direction)) {
            images.upImg.paintIcon(this, g, snackx[0], snacky[0]);
        }

        //        //第一节身子
//        images.bodyImg.paintIcon(this,g,snackx[1],snacky[1]);
//        //第二节身子
//        images.bodyImg.paintIcon(this,g,snackx[2],snacky[2]);
        //优化
        for(int i=1;i<length;i++){
            images.bodyImg.paintIcon(this,g,snackx[i],snacky[i]);
        }
        //若游戏暂停,界面中间应该有一个提示:开始游戏
        if(isStart==false){
            //画一个文字先设置画笔颜色
            g.setColor(new Color(114,90,255));
            //设置文字字体,加粗,字号
            g.setFont(new Font("微软雅黑",Font.BOLD,40));
            //设置文字内容,位置
            g.drawString("点击空格开始游戏",250,330);
        }
        //画出食物
        images.foodImg.paintIcon(this,g,foodx,foody);
        //画积分
        g.setColor(new Color(248, 0, 63));
        g.setFont(new Font("微软雅黑",Font.BOLD,60));
        g.drawString("积分:"+score,150,80);

        //画死亡状态
        if(isdie==true) {
            g.setColor(new Color(0, 0, 0));
            g.setFont(new Font("楷体", Font.BOLD, 50));
            g.drawString("游戏结束,您的积分为:" + score, 130, 280);
            g.drawString("点击空格重新开始游戏", 130, 350);
        }
    }
}
